/* @Author: Benny Vermonden
 * @Description: Data Access object voor eigenaar toe te voegen die ofwel een maatschappij of een persoon eigenaar
 * @Author: Bertels Nick c1019387
 * @Description: getAllEigenaars 
 * @Date: 21/11/2013
 * 
*/

package core.logic.dataAccess;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import javax.swing.JOptionPane;

import core.logic.services.utilServices.ConnectionService;
import core.models.dataModels.searchModels.ZoekEigenaarModel;
import core.models.domainModel.Eigenaar;
import core.models.domainModel.EigenaarOverzicht;
import core.models.domainModel.Maatschappij;
import core.models.domainModel.Persoon;

public class EigenaarDAO {

	public static int AddMaatschappij(Maatschappij eigenaar){
		String sql = "INSERT INTO Eigenaar(EigenaarsType, AdresId, MaatschappijNaam) VALUES (?, ?, ?)";
		
		int ok = 0;
	
		try{
			
			Connection con = ConnectionService.getConnection();
			PreparedStatement pst = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
			pst.setString(1, "M");
			pst.setInt(2, eigenaar.Adres.get_adresId());
			pst.setString(3, eigenaar.getNaam());
			ok = pst.executeUpdate();
			
			ResultSet rs = pst.getGeneratedKeys(); //ophalen van de gegenereerde id
			rs.next();
			eigenaar.setEigenaarID(rs.getInt(1));
		}
		catch(SQLException ex){
			
		}
		return ok;
	}

	public static int AddPersoonsEigenaar(Persoon p){
		String sql = "INSERT INTO Eigenaar(EigenaarsType, PersoonId) VALUES (?, ?)";
		
		int ok = 0;
	
		try{
			
			Connection con = ConnectionService.getConnection();
			PreparedStatement pst = con.prepareStatement(sql);
			pst.setString(1, "P");
			pst.setInt(2, p.getPersoonId());
			ok = pst.executeUpdate();
			
		}
		catch(SQLException ex){
			
		}
		return ok;
	}
	
	public static ArrayList<Eigenaar> getAllEigenaars()
	{
		String sql = "SELECT ei.EigenaarId AS EigenaarId, "
				+       "ei.EigenaarsType AS EigenaarsType, "
				+       "ei.MaatschappijNaam AS EigenaarMaatschappijNaam, "
				+       "pe.PersoonId AS PersoonId, "
				+       "pe.Naam AS PersoonNaam, "
				+       "pe.Voornaam AS PersoonVoornaam, "
				+       "pe.Geboortedatum AS PersoonGeboortedatum, "
				+       "ei.AdresId AS EigenaarAdresId "
				+    "FROM Eigenaar ei LEFT OUTER JOIN Persoon pe ON (ei.PersoonId = pe.PersoonId)";
		ArrayList<Eigenaar> lijst = new ArrayList<Eigenaar>();
		Eigenaar eigenaar = null;
		Persoon persoon = null;
		
		try
		{
			Statement statement = ConnectionService.getConnection().createStatement();
			ResultSet rs = statement.executeQuery(sql);
			
			while(rs.next())
			{
				persoon = new Persoon(
						rs.getInt("PersoonId"),
						rs.getString("PersoonVoornaam"),
						rs.getString("PersoonNaam"),
						null,
						rs.getString("PersoonGeboorteDatum"));
				eigenaar = new Eigenaar(
						rs.getInt("EigenaarId"),
						rs.getString("EigenaarsType"),
						rs.getInt("EigenaarAdresId"),
						rs.getString("EigenaarMaatschappijNaam"),
						persoon);
				
				lijst.add(eigenaar);
			}
		}
		
		catch(SQLException ex)
		{
			ex.printStackTrace();
		}
		
		return lijst;
	}
	
	/*Benny Vermonden c1025695*/
	
	public static ArrayList<EigenaarOverzicht> ZoekEigenaar(ZoekEigenaarModel model)
	{
		String sql = "select 'Maatschappij' as type, E.MaatschappijNaam AS Naam, '' AS Voornaam, A.Straat, A.Huisnumer, A.Postcode, A.Gemeente, A.Land"+
					" from Eigenaar E, Adres A"+
					" where E.AdresId = A.AdresId " +
				/*	if (e.get_maatschappijNaam() != null){
					
						sql+= 	" AND (E.MaatschappijNaam LIKE '%'+?+'%') " ;
					}*/
				 	" AND (E.MaatschappijNaam LIKE '%'+?+'%' OR ? IS NULL) " +
					" AND ( ? IS NULL OR ? = '') " +
				 	" AND (A.Straat LIKE '%'+?+'%' OR ? IS NULL) " +
					" AND (A.Huisnumer LIKE '%'+?+'%' OR ? IS NULL) " +
					" AND (A.PostCode LIKE '%'+?+'%' OR ? IS NULL) " +
					" AND (A.Gemeente LIKE '%'+?+'%' OR ? IS NULL) " +
					" AND (A.Land LIKE '%'+?+'%' OR ? IS NULL) " +
					
					" union " +
					
					"select 'Persoon' as type, P.naam, P.voornaam, A.Straat, A.Huisnumer, A.Postcode, A.Gemeente, A.Land" +
					" from Eigenaar, Persoon p, Adres A " +
					" where Eigenaar.PersoonId = p.PersoonId " + 
					" AND p.AdresId = A.AdresId " +
					" AND (P.naam LIKE '%'+?+'%' OR ? IS NULL) " +
					" AND (P.Voornaam LIKE '%'+?+'%' OR ? IS NULL) " +
					" AND (A.Straat LIKE '%'+?+'%' OR ? IS NULL) " +
					" AND (A.Huisnumer LIKE '%'+?+'%' OR ? IS NULL) " +
					" AND (A.PostCode LIKE '%'+?+'%' OR ? IS NULL) " +
					" AND (A.Gemeente LIKE '%'+?+'%' OR ? IS NULL) " +
					" AND (A.Land LIKE '%'+?+'%' OR ? IS NULL)";
		
		ArrayList<EigenaarOverzicht> overzicht = new ArrayList<EigenaarOverzicht>();
		
		
		try
		{
			PreparedStatement st = ConnectionService.getConnection().prepareStatement(sql);
			int i = 1;
			st.setString(i++, model.getNaam());
			st.setString(i++,  model.getNaam());
			st.setString(i++, model.getVoornaam());
			st.setString(i++, model.getVoornaam());
			st.setString(i++, model.get_straat());
			st.setString(i++, model.get_straat());
			st.setString(i++, model.get_huisnummer());
			st.setString(i++, model.get_huisnummer());
			st.setString(i++, model.get_postcode());
			st.setString(i++, model.get_postcode());
			st.setString(i++, model.get_gemeente());
			st.setString(i++, model.get_gemeente());
			st.setString(i++, model.get_land());
			st.setString(i++, model.get_land());
			st.setString(i++, model.getNaam());
			st.setString(i++,  model.getNaam());
			st.setString(i++, model.getVoornaam());
			st.setString(i++, model.getVoornaam());
			st.setString(i++, model.get_straat());
			st.setString(i++, model.get_straat());
			st.setString(i++, model.get_huisnummer());
			st.setString(i++, model.get_huisnummer());
			st.setString(i++, model.get_postcode());
			st.setString(i++, model.get_postcode());
			st.setString(i++, model.get_gemeente());
			st.setString(i++, model.get_gemeente());
			st.setString(i++, model.get_land());
			st.setString(i++, model.get_land());
			
			ResultSet rs = st.executeQuery();
			
			while(rs.next())
			{
				overzicht.add(new EigenaarOverzicht(rs.getString("Type"), rs.getString("naam"), rs.getString("voornaam"), rs.getString("straat"), rs.getInt("huisnumer"), rs.getString("postcode"),rs.getString("Gemeente"),rs.getString("land")));
			}
		}
		catch (Exception ex)
		{
			ex.printStackTrace();
		}
		return overzicht;
	}
	
	//@Author: Wijnen David [c1026300] 2013-12-12 
	//-------------------------------------------
	public static Eigenaar getEigenaarByID(int id)
	{
		Eigenaar eigenaar = null;
		
		String sql = "SELECT DISTINCT * "
				+ 	 "FROM Eigenaar "
				+	 "WHERE EigenaarId = ?";
		
		try
		{
			PreparedStatement pst = ConnectionService.getConnection().prepareStatement(sql)	;
			pst.setInt(1, id);
			ResultSet rs = pst.executeQuery();
			
			while(rs.next())
			{
				eigenaar = new Eigenaar();
				eigenaar.setEigenaarID(rs.getInt("EigenaarId"));
				eigenaar.setEigenaarsType(rs.getString("EigenaarsType"));
				eigenaar.setMaatschappijNaam(rs.getString("MaatschappijNaam"));
				eigenaar.setAdresId(rs.getInt("AdresId"));
			}
		}
		catch (Exception ex)
		{
			JOptionPane.showMessageDialog(null, ex.getMessage());
			ex.printStackTrace();
		}
		return eigenaar;
	}	
}
